package Model;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import Model.ObjectViews.LoteView;
import Model.ObjectViews.MineralLoteView;

public abstract class Lote 
{
	//Atributos
	private int nro;
	private float areaSiembra;
	private Propietario propietario;
	private List<MineralLote> minerales;
	private boolean sembrado;
	private boolean habilitado;
	private Siembra ultimaSiembra;
	private boolean activo;
	
	//Getters
	public int getNro() 
	{
		return nro;
	}
	public float getAreaSiembra() 
	{
		return areaSiembra;
	}
	public Propietario getPropietario() 
	{
		return propietario;
	}
	public boolean isSembrado() 
	{
		return sembrado;
	}
	public boolean isHabilitado() 
	{
		return habilitado;
	}
	public boolean isActivo() 
	{
		return activo;
	}
	public void setUltimaSiembra(Siembra ultimaSiembra) 
	{
		this.ultimaSiembra = ultimaSiembra;
	}
	
	//Setters
	public void setNro(int nro) 
	{
		this.nro = nro;
	}
	public void setAreaSiembra(float areaSiembra) 
	{
		this.areaSiembra = areaSiembra;
	}
	public void setPropietario(Propietario propietario) 
	{
		this.propietario = propietario;
	}
	public void setSembrado(boolean sembrado) 
	{
		this.sembrado = sembrado;
	}
	public void setHabilitado(boolean habilitado) 
	{
		this.habilitado = habilitado;
	}
	public void setActivo(boolean activo) 
	{
		this.activo = activo;
	}
	public Siembra getUltimaSiembra() 
	{
		return ultimaSiembra;
	}
	
	//Constructor
	public Lote(int nroLote, float areaSiembra, Propietario propietario)
	{
		this.nro = nroLote;
		this.areaSiembra = areaSiembra;
		this.propietario = propietario;
		this.minerales = new ArrayList<MineralLote>();
		this.sembrado = false;
		this.habilitado = true;
		this.ultimaSiembra = null;
		this.activo = true;
	}
	
	//Metodos de negocio
	public void addMineral(Mineral mineral, float porcentaje)
	{
		MineralLote mineralLote = this.getMineralLote(mineral);
		
		if (mineralLote == null)
		{
			mineralLote = new MineralLote(mineral, porcentaje);
			minerales.add(mineralLote);
		}
		else
		{
			mineralLote.setPorcentaje(porcentaje);
		}
	}
	
	public void removeMineral(Mineral mineral)
	{
		MineralLote mineralLote = this.getMineralLote(mineral);
		
		if (mineralLote != null)
		{
			minerales.remove(mineralLote);
		}
		else
		{
			//Items does not exist.
			//TODO: manage error? - Throw exception? Or should I nothing?
		}
	}
	
	public float getPorcentaje(Mineral mineral)
	{
		MineralLote mineralLote = this.getMineralLote(mineral);
		
		if (mineralLote != null)
		{
			return mineralLote.getPorcentaje();
		}
		else
		{
			return 0;
		}
	}
	
	public boolean isEquals(int nroLote)
	{
		return (this.nro == nroLote);
	}
	
	//Private methods
	private MineralLote getMineralLote(Mineral mineral)
	{
		MineralLote retVal = null;
			
		for (Iterator<MineralLote> iterator = minerales.iterator(); iterator.hasNext();) 
		{
			MineralLote mineralLote = (MineralLote) iterator.next();
			if (mineralLote.getMineral() == mineral)
			{
				retVal = mineralLote;
				break;
			}
		}
		
		return retVal;
	}
	
	//View getter
	public LoteView getView()
	{
		LoteView view = new LoteView();
		view.setAreaSiembra(this.getAreaSiembra());
		view.setHabilitado(this.isHabilitado());
		view.setNro(this.getNro());
		view.setPropietario(this.getPropietario().getView());
		view.setSembrado(this.isSembrado());

		ArrayList<MineralLoteView> itemsView = new ArrayList<MineralLoteView>();
		for (Iterator<MineralLote> iterator = this.minerales.iterator(); iterator.hasNext();) 
		{
			MineralLote item = (MineralLote) iterator.next();
			itemsView.add(item.getView());
		}
		view.setMinerales(itemsView);
		
		return view;
	}
}
